package com.common.util.encode;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;


/**
 * <p>Title: 各种格式的编码加码工具类</p>
 *
 * <p>Description:集成Commons-Codec,Commons-Lang及JDK提供的编解码方法. </p>
 *
 * <p>Copyright: 2011</p>
 *
 * <p>Company: gotop</p>
 *
 * @author phc
 *
 * @date 2011-3-8
 *
 * @version 1.0
 **/
public class EncodeUtil {

	private static final String DEFAULT_URL_ENCODING = "UTF-8";

	/**
	 * Hex编码.
	 */
	public static String hexEncode(byte[] input) {
		return Hex.encodeHexString(input);
	}

	/**
	 * Hex解码.
	 */
	public static byte[] hexDecode(String input) {
		try {
			return Hex.decodeHex(input.toCharArray());
		} catch (DecoderException e) {
			throw new IllegalStateException("Hex Decoder exception", e);
		}
	}

	/**
	 * Base64编码.
	 */
	public static String base64Encode(byte[] input) {
		return Base64.encodeBase64String(input);
	}

	/**
	 * Base64解码.
	 */
	public static byte[] base64Decode(String input) {
		return Base64.decodeBase64(input);
	}
	
	/**
	 * Base64编码, URL安全(将Base64中的URL非法字符如+,/=转为其他字符, 见RFC3548).
	 */
	public static String base64UrlSafeEncode(byte[] input) {
		return Base64.encodeBase64URLSafeString(input);
	}

	/**
	 * URL 编码, Encode默认为UTF-8. 
	 */
	public static String urlEncode(String input) {
		return urlEncode(input, DEFAULT_URL_ENCODING);
	}

	/**
	 * URL 编码.
	 */
	public static String urlEncode(String input, String encoding) {
		try {
			return URLEncoder.encode(input, encoding);
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException("Unsupported Encoding Exception", e);
		}
	}

	/**
	 * URL 解码, Encode默认为UTF-8. 
	 */
	public static String urlDecode(String input) {
		return urlDecode(input, DEFAULT_URL_ENCODING);
	}

	/**
	 * URL 解码.
	 */
	public static String urlDecode(String input, String encoding) {
		try {
			return URLDecoder.decode(input, encoding);
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException("Unsupported Encoding Exception", e);
		}
	}

	
	/**
	 * 数据表字段加密
	 * @param source
	 * @add garyman 20110830
	 * @return
	 */
	public static String dataStringEncode(String source){
		String o_tablename = "";
		String v_tablename = source;
		v_tablename = base64Encode(v_tablename.getBytes());
		o_tablename = hexEncode(v_tablename.getBytes());
		return o_tablename;
	}
	
	/**
	 * 数据表字段解密
	 * @param source
	 * @add garyman 20110830
	 * @return
	 */
	public static String dataStringDecode(String source){
		String rightTblName=source;
		rightTblName = new String(hexDecode(rightTblName));
		String tabTblName="";
		tabTblName = new String(base64Decode(rightTblName));
		return tabTblName;
	}
}
